<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <xsl:output method="xml" omit-xml-declaration="yes"/>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Templates de génération HTML                                                                                  -->
  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour un attribut donné
       Dans ce template, le contexte est un attribut (tag <attLst><att>)
    -->
  <xsl:template name="genHtmForAtt" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td>
        <xsl:value-of select="att/nom"/>
      </td>
      <td>
        <xsl:value-of select="att/dtaTyp"/>
      </td>
      <td>
        <xsl:value-of select="att/valDft"/>
      </td>
      <td>
        <xsl:value-of select="att/flgIdn"/>
      </td>
      <td>
        <xsl:value-of select="att/flgObl"/>
      </td>
    </tr>

    <!-- Les contraintes de l'attribut -->
    <xsl:for-each select="cntLst/cnt">
      <tr>
        <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
        <td class="tblCll">
        </td>
        <td colspan="3" class="tblCllPtt">
          <xsl:value-of select="txtCnt"/>
        </td>
        <td  class="tblCllPtt">
          <xsl:value-of select="nom" />
        </td>
      </tr>
    </xsl:for-each>

    <!-- Les commentaires de l'attribut -->
    <xsl:for-each select="cmmLst/cmm">
      <tr>
        <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
        <td class="tblCll">
        </td>
        <td colspan="3"  class="tblCllPtt">
          <xsl:value-of select="txt"/>
        </td>
        <td  class="tblCllPtt">
          <xsl:value-of select="nom" />
        </td>
      </tr>
    </xsl:for-each>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour la liste des attributs
       Dans ce template, le contexte est une liste d'attributs (tag <attLst>)
    -->
  <xsl:template name="genHtmForAttLst" >
    <h2>Liste des attributs</h2>

    <xsl:if test="count( att/att ) > 0" >
      <table class="tbl">
        <tr class="tblLgnHdr">
          <th>Nom</th>
          <th>Type</th>
          <th>Défaut</th>
          <th>Identifiant</th>
          <th>Obligatoire</th>
        </tr>

        <xsl:for-each select="att">
          <xsl:call-template name="genHtmForAtt">
            <xsl:with-param name="p_lgnCls">
              <xsl:choose>
                <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                <xsl:otherwise>tblLgnImp</xsl:otherwise>
              </xsl:choose>
            </xsl:with-param>
          </xsl:call-template>
        </xsl:for-each>

      </table>
    </xsl:if>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour un commentaire donné
       Dans ce template, le contexte est un commentaire (tag <cmm>)
    -->
  <xsl:template name="genHtmForCmm" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td>
        <xsl:value-of select="txt"/>
      </td>
      <td>
        <xsl:value-of select="nom"/>
      </td>
      <td>
        <xsl:value-of select="cmmTyp"/>
      </td>
      <td>
        <xsl:value-of select="cmmEtt"/>
      </td>
    </tr>
  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une liste de commentaires
       Dans ce template, le contexte est une liste de commentaires (tag <cmmLst>)
    -->
  <xsl:template name="genHtmForCmmLst" >

    <h2>Commentaires</h2>

    <xsl:if test="count( cmm ) > 0" >

      <table class="tbl">
        <tr class="tblLgnHdr">
          <th>Texte</th>
          <th>Nom</th>
          <th>Type</th>
          <th>Etat</th>
        </tr>

          <xsl:for-each select="cmm">
            <xsl:call-template name="genHtmForCmm">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

      </table>
    </xsl:if>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une contrainte donnée
       Dans ce template, le contexte est une contrainte (tag <cnt>)
    -->
  <xsl:template name="genHtmForCnt" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td>
        <xsl:value-of select="nom"/>
      </td>
      <td>
        <xsl:value-of select="cntEvn"/>
      </td>
      <td>
        <xsl:value-of select="txtCnt"/>
      </td>
    </tr>
  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une liste de contraintes
       Dans ce template, le contexte est une liste de contraintes (tag <cntLst>)
    -->
  <xsl:template name="genHtmForCntLst" >

    <h2>Liste des contraintes</h2>

    <xsl:if test="count( cnt ) > 0" >

      <table class="tbl">
        <tr class="tblLgnHdr">
          <th>Nom</th>
          <th>Déclencheur</th>
          <th>Texte</th>
        </tr>

          <xsl:for-each select="cnt">
            <xsl:call-template name="genHtmForCnt">
              <xsl:with-param name="p_lgnCls">
                <xsl:choose>
                  <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                  <xsl:otherwise>tblLgnImp</xsl:otherwise>
                </xsl:choose>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>

      </table>
    </xsl:if>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une relation donnée
       Dans ce template, le contexte est une relation (tag <rlt>)
    -->
  <xsl:template name="genHtmForRlt" >
    <xsl:param name="p_lgnCls"/>
    <tr>
      <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
      <td>
        <xsl:value-of select="rlt/nom"/>
      </td>
      <td>
        <xsl:value-of select="rlt/src"/>
      </td>
      <td>
        <xsl:value-of select="rlt/crdMinSrcDst"/>
        ..
        <xsl:value-of select="rlt/crdMaxSrcDst"/>
      </td>
      <td>
        <xsl:value-of select="rlt/dst"/>
      </td>
      <td>
        <xsl:value-of select="rlt/dst"/>
      </td>
      <td>
        <xsl:value-of select="rlt/crdMinDstSrc"/>
        ..
        <xsl:value-of select="rlt/crdMaxDstSrc"/>
      </td>
      <td>
        <xsl:value-of select="rlt/src"/>
      </td>
      <td>
        <xsl:value-of select="rlt/pkg"/>
      </td>
    </tr>

    <!-- Les contraintes de la relation -->
    <xsl:for-each select="cntLst/cnt">
      <tr>
        <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
        <td class="tblCll">
        </td>
        <td colspan="6"  class="tblCllPtt">
          <xsl:value-of select="txtCnt"/>
        </td>
        <td  class="tblCllPtt">
          <xsl:value-of select="nom" />
        </td>
      </tr>
    </xsl:for-each>

    <!-- Les commentaires de la relation -->
    <xsl:for-each select="cmmLst/cmm">
      <tr>
        <xsl:attribute name="class"><xsl:value-of select="$p_lgnCls"/></xsl:attribute>
        <td class="tblCll">
        </td>
        <td colspan="6" class="tblCllPtt">
          <xsl:value-of select="txt"/>
        </td>
        <td  class="tblCllPtt">
          <xsl:value-of select="nom" />
        </td>
      </tr>

    </xsl:for-each>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Génération du HTML pour une liste de relations
       Dans ce template, le contexte est une liste de relations (tag <rltLst>)
    -->
  <xsl:template name="genHtmForRltLst" >
    <xsl:param name="pSns" />

    <h2>
      <xsl:choose>
        <xsl:when test="$pSns = 'IN'" >Les relations arrivant à l'entité</xsl:when>
        <xsl:when test="$pSns = 'OUT'">Les relations partant de l'entité</xsl:when>
      </xsl:choose>
    </h2>

    <xsl:if test="count( rlt ) > 0" >

      <table class="tbl">
        <tr class="tblLgnHdr">
          <th>Nom</th>
          <th>Un enreg. de</th>
          <th>Correspond à </th>
          <th>Enreg. de</th>
          <th>Un enreg. de</th>
          <th>Correspond à </th>
          <th>Enreg. de</th>
          <th>Package</th>
        </tr>

        <xsl:for-each select="rlt">
          <xsl:call-template name="genHtmForRlt">
            <xsl:with-param name="p_lgnCls">
              <xsl:choose>
                <xsl:when test="(position() mod 2) = 0">tblLgnPai</xsl:when>
                <xsl:otherwise>tblLgnImp</xsl:otherwise>
              </xsl:choose>
            </xsl:with-param>
          </xsl:call-template>
        </xsl:for-each>

      </table>

    </xsl:if>

  </xsl:template>

  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
  <!-- Templates de changement de contexte                                                                           -->
  <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

  <xsl:template match="/">
    <!-- Rappel : Le HTML généré sera inséré dans une balise <div> -->

    <h1>Fiche détaillée de l'entité <xsl:value-of select="doc/ttr" /></h1>

    <!-- // Les Informations de l'entité ////////////////////////////////////////////////////////// -->

    <table class="tbl">
      <tr>
        <td class="tblHdrLft">
          Package
        </td>
        <td class="tblCllHdr">
          <xsl:value-of select="doc/ent/ent/pkg"/>
        </td>
      </tr>
      <tr>
        <td class="tblHdrLft">
          Description
        </td>
        <td class="tblCllHdr">
          <xsl:value-of select="doc/ent/ent/dscEnt"/>
        </td>
      </tr>
      <tr>
        <td class="tblHdrLft">
          Création
        </td>
        <td class="tblCllHdr">
          <xsl:value-of select="doc/ent/ent/audit/datCre"/>
        </td>
      </tr>
      <tr>
        <td class="tblHdrLft">
          Dern. màj
        </td>
        <td class="tblCllHdr">
          <xsl:value-of select="doc/ent/ent/audit/datMaj"/>
        </td>
      </tr>
    </table>

    <!-- // Les attributs de l'entité ///////////////////////////////////////////////////////////// -->
    <xsl:for-each select="doc/ent/attLst">
      <xsl:sort select="nom"/>
      <xsl:call-template name="genHtmForAttLst" />
    </xsl:for-each>

    <!-- // Les relations arrivant à l'entité ///////////////////////////////////////////////////// -->
    <xsl:for-each select="doc/ent/rltLst[1]">
      <xsl:sort select="nom"/>
      <xsl:call-template name="genHtmForRltLst">
        <xsl:with-param name="pSns" select="'IN'"/>
      </xsl:call-template>
    </xsl:for-each>

    <!-- // Les relations partant de l'entité //////////////////////////////////////////////////// -->
    <xsl:for-each select="doc/ent/rltLst[2]">
      <xsl:sort select="nom"/>
      <xsl:call-template name="genHtmForRltLst">
        <xsl:with-param name="pSns" select="'OUT'"/>
      </xsl:call-template>
    </xsl:for-each>

    <!-- // Les contraintes de l'entité ////////////////////////////////////////////////////////// -->
    <xsl:for-each select="doc/ent/cntLst">
      <xsl:sort select="nom"/>
      <xsl:call-template name="genHtmForCntLst" />
    </xsl:for-each>

    <!-- // Les commentaires de l'entité ///////////////////////////////////////////////////////// -->
    <xsl:for-each select="doc/ent/cmmLst">
      <xsl:sort select="nom"/>
      <xsl:call-template name="genHtmForCmmLst" />
    </xsl:for-each>

  </xsl:template>

</xsl:stylesheet>